#ifndef _TCPCONNECTION_H
#define _TCPCONNECTION_H

#include "01_InetAddress.hpp"
#include "02_Socket.hpp"
#include "03_SocketIO.hpp"
//#include "06_EventLoop.hpp"     // 不知道会不会循环引用
#include <string>
#include <memory>
#include <functional>

namespace xy
{
class Event_Loop;                 // 前向声明好像要写在类中，否则在初始化时可能因为作用域而报错

class TCPconnection
    //:public std::enable_shared_from_this<TCPconnection> // 在类的成员函数中获取指向自身的shared_ptr
    :public std::enable_shared_from_this<xy::TCPconnection> // 明确指定命名空间
{
public:
    typedef std::shared_ptr<TCPconnection> TCPconnectionPtr;
    typedef std::function<void (const TCPconnectionPtr&)> Connection_Callback;
    typedef std::function<void (const TCPconnectionPtr&, const std::string&)> Message_Callback;
    typedef std::function<void (const TCPconnectionPtr&)> Close_Callback;
    
    // 设置回调函数
    void set_connection_callback(const Connection_Callback& cb){_on_connection_cb = cb;}
    void set_message_callback(const Message_Callback& cb){_on_message_cb = cb;}
    void set_close_callback(const Close_Callback& cb){_on_close_cb = cb;}

public:
    TCPconnection(int, Event_Loop*);
    ~TCPconnection() = default;

    InetAddress get_local_address();
    InetAddress get_peer_address();
    void send(const std::string&);
    int receive();
    void shutdown();
    bool is_closed();
    std::string tostring() const;
    int get_fd();

    void handle_connection_callback();
    void handle_message_callback();
    void handle_close_callback();

private:
    // 五元组信息
    Socket _sock;
    SocketIO _sockIO;
    InetAddress _localAddr;
    InetAddress _peerAddr;
    
    // 循环所需参数
    Event_Loop *_loop;          // 使用原始指针而非shared_ptr，避免相互引用
    bool _is_closed;            // 其次在Event_loop中有相似的函数，是_is_looping，但我想终止循环和断开链接还是有区别的吧
    std::string _msg_cache;     // 缓存

    // 信号
    Connection_Callback _on_connection_cb;
    Message_Callback _on_message_cb;
    Close_Callback _on_close_cb;
};

}


#endif
